﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>
#include<assert.h>
//
//void my_memcpy(void* dest, const void* sur, size_t num)
//{
//	//专门作用与两块内存空间不想交的情况🍌
//	assert(dest && sur);
//	while (num--)
//	{
//		*(char*)dest = *(char*)sur;
//		dest = (char*)dest + 1;
//		sur  = (char*)sur + 1;
//	}
//}
//
//void my_memmove(void* dest, const void* sur, size_t num)
//{
//	assert(dest && sur);
//	//判断指针 dest 与 sur 的位置
//	if (dest < sur)
//	{
//		//从前往后拷贝！
//		while (num--)
//		{
//			*(char*)dest = *(char*)sur;
//			dest = (char*)dest + 1;
//			sur = (char*)sur + 1;
//		}
//	}
//	else
//	{
//		//从后往前拷贝!
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)sur + num);
//		}
//	}
//}
//
//void my_memset(void* dest, int c, size_t count)
//{
//	while (count--)
//	{
//		*(char*)dest = c;
//		dest = (char*)dest + 1;
//	}
//}

//int main()
//{
//	char* cmm = "ls131452cmm";
//	char lss[20] = { 0 };
//
//	my_memcpy(lss, cmm, strlen(cmm) + 1);
//	printf("模拟memcpy ： %s\n", lss);
////
////	my_memmove(lss + 2, lss, 5);
////	printf("模拟memmove： %s\n", lss);
////
////	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
////	my_memset(arr, 0, sizeof(arr));
////	for (int i = 0; i < 10; i++)
////		printf("%d ", i[arr]);
////
////	return 0;
////}
//char* my_strncpy(char* dest,const char* sur,size_t num)
//{
//	assert(dest && sur);
//	char* ret = dest;
//
//	while (*sur != '\0' && num--)
//	{
//		*dest++ = *sur++;
//	}
//	while (num--)
//	{
//		*dest++ = '\0';
//	}
//	return ret;
//}
//
//char* my_strncat(char* dest, const char* sur, size_t num)
//{
//	assert(dest && sur);
//	char* ret = dest;
//	//找到字符串结束标志,循环结束时,指针dest指向'\0'
//	while (*dest)
//		dest++;
//	//开始拷贝
//	while (num--)
//		*dest++ = *sur++;
//	//
//	return ret;
//}

//int main()
//{
//	char arr[20] = "abcdefgh";
//	//追加字符串,
//	char* ret = my_strncat(arr, arr, 3);
//	printf("%s", ret);
//	return 0;
//}
//
//typedef union zmh
//{
//	int _a;
//	char _b;
//}zmh;
////
////int main()
////{
////	zmh num;
////	num._a = 0x11223344;
////	if (num._b == 0x44)
////		printf("小端存储\n");
////	else
////		printf("大端存储\n");
////}
//#include<ctype.h>
////int main()
////{
////	char ch = '\n';
////	if (isspace(ch))
////		printf("是空白字符\n");
////	else
////		printf("不是空白字符\n");	
////	return 0;
////}
////int main()
////{
////	//举个代码示例,这些函数用法很简单的
////	char c = tolower('C');
////	printf("%c\n", c);
////	char C = toupper('c');
////	printf("%c", C);
////	return 0;
////}
//#include<assert.h>
//#include<string.h>
//#include<stdio.h>
//
//size_t my_strlen(const char* str)
//{
//	assert(str);
//
//	const char* prev = str;
//	while (*str)
//		str++;
//
//	return str - prev;
//}
//
//char* my_strcpy(char* dest, const char* sour)
//{
//	assert(dest && sour);
//
//	char* ret = dest;
//	while (*dest++ = *sour++);
//
//	return ret;
//}
//
//char* my_strcat(char* dest, const char* sour)
//{
//	assert(dest && sour);
//
//	char* ret = dest;
//	while (*dest)
//		dest++;
//	while (*dest++ = *sour++);
//
//	return ret;
//}
//
//int  my_strcmp(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//
//	while (*str1 == *str2)
//	{
//		if (*str1 == '\0')
//			return 0;
//		str1++;
//		str2++;
//	}
//
//	return *str1 - *str2;
//}
//
//char* my_strstr(const char* str1, const char* str2)
//{
//	assert(str1 && str2);
//	if (!*str2)
//		return str1;
//	const char* s1  = str1;
//	const char* s2  = str2;
//	const char* cur = str1;
//	while (*cur)
//	{
//		s1 = cur,s2 = str2;
//		while (*s1++ == *s2++)
//		{
//			if (*s2 == '\0')
//				return cur;
//		}
//		cur++;
//	}
//	return NULL;
//}

//int main()
//{
//	char arr[] = "zmh.zmh.zmh.zmh.1314";
//	char* ptr = NULL;
//
//	do
//	{
//		ptr = (ptr == NULL ? strtok(arr, ".") : strtok(NULL, "."));
//		if (ptr != NULL)
//			printf("%s\v", ptr);
//	} while (ptr);
//
//	return 0;
//}
//#include<errno.h>
//#include<stdlib.h>
//int main()
//{
//	
//	int* nums = malloc(100000000000000 * sizeof(int));
//	if (nums == NULL)
//	{
//		perror("开辟空间失败");
//	}
//	else
//	{
//		free(nums);
//		nums = NULL;
//	}
//	return 0;
//}
//
//int main()
//{
//	unsigned int a = 0x00001234;
//	00 00 12 34
//	unsigned char b = *(unsigned char*)&a;
//	return 0;
//}
//
//struct
//{
//	int a;
//}s;
//int main()
//{
//	s.a = 10;
//	printf("%d", s.a);
//	return 0;
//}
//
void* my_memcpy(void* dest, const void* sour, size_t num)
{
	assert(dest && sour);
	void* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)sour;
		((char*)dest)++;
		((char*)sour)++;
	}
	return ret;
}
//int main()
//{
//	int zmh[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int lyy[15] = { 0 };
//	my_memcpy(lyy, zmh, 2 * 5 * sizeof(int));
//	//打印
//	for (int i = 0; i < 15; i++)
//		printf("%d ", i[lyy]);
//	return 0;
////}
//void* my_memmove(void* dest, void* sour, size_t num)
//{
//	assert(dest && sour);
//	void* ret = dest;
//	if (dest < sour)
//	{
//		while (num--)
//		{
//			*(char*)dest = *(char*)sour;
//			((char*)dest)++;
//			((char*)sour)++;
//		}
//	}
//	else
//	{
//		while (num--)
//			((char*)dest)[num] = ((char*)sour)[num];
//	}	
//	return ret;
//}
//int main()
//{
//	int zmh[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int lyy[10] = { 0 };
//
//	my_memcpy(lyy, zmh, 2 * 5 * sizeof(int));
//	my_memmove(lyy, lyy+2, 5 * sizeof(int));
//	for (int i = 0; i < 10; i++)
//		printf("%d ", i[lyy]);
//	printf("\n");
//
//	my_memcpy(lyy, zmh, 2 * 5 * sizeof(int));
//	my_memmove(lyy+2, lyy, 5 * sizeof(int));
//	for (int i = 0; i < 10; i++)
//		printf("%d ", i[lyy]);
//	return 0;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,0x55223344,6,7,8,9,10 };
//	int arr2[10] = { 1,2,3,4,0x11223344,6,7,8,9,10 };
//	printf("%d\n", memcmp(arr1, arr2, 5 * sizeof(int)));
//	return 0;
//}

//int main()
//{
//	int a = 15;
////原码：0000 0000 0000 0000 0000 0000 0000 1111
////反码：1111 1111 1111 1111 1111 1111 1111 0000
////补码：1111 1111 1111 1111 1111 1111 1111 0001
////转换为16进制-> ff ff ff f1
////补码->原码(符号位不变，其余位按位取反，后+1)
////原码：0000 0000 0000 0000 0000 0000 0000 1111
//	return 0;
////}
//int main()
//{
//	int a = 15;
////原码：0000 0000 0000 0000 0000 0000 0000 1111
////反码：0000 0000 0000 0000 0000 0000 0000 1111
////补码：0000 0000 0000 0000 0000 0000 0000 1111
//	int b = -1;
////原码：1000 0000 0000 0000 0000 0000 0000 0001
////反码：1111 1111 1111 1111 1111 1111 1111 1110
////补码：1111 1111 1111 1111 1111 1111 1111 1111
////补码->原码(符号位不变，其余位按位取反，后+1)
////原码：1000 0000 0000 0000 0000 0000 0000 0001
//	int c = a + b;
////a+b-> 0000 0000 0000 0000 0000 0000 0000 1111+
////      1111 1111 1111 1111 1111 1111 1111 1111
////补码-> 0000 0000 0000 0000 0000 0000 0000 1110 
////	0x0000000e
//	return 0;
//}
//
//int main()
//{
//	float a = 5.5;
////先转换为二进制
////-> 101.1
////再转换为二进制的科学计数法：(-1)^S  *  M  *  2^E  
////-> (-1)^0  *  1.011  *  2^2  
//// 	   S = 0
//// 	   M = 1.011
//// 	   E = 2
////数据在内存中是如何存储的：
////-> 0 10000001 01100000000000000000000 
////转为16进制(0100 0000 1011 0000 0000 0000 0000 0000)
////-> 40 b0 00 00
////VS上面是小端字节序存储(可以先看大小端字节的讲解)
////-> 00 00 b0 40
//
//	return 0;
//}
//int main()
//{
//	float a = -1.25;
////先转换为二进制
////-> (-)1.01
////再转换为二进制的科学计数法：(-1)^S  *  M  *  2^E  
////-> (-1)^1  *  1.01  *  2^0  
//// 	   S = 1
//// 	   M = 1.01
//// 	   E = 0
////数据在内存中是如何存储的：
////-> 1 01111111 01000000000000000000000 
////转为16进制(1011 1111 1010 0000 0000 0000 0000 0000)
////-> bf a0 00 00
////VS上面是小端字节序存储(可以先看大小端字节的讲解)
////-> 00 00 a0 bf
//	return 0;
//}
//union zmh
//{
//	int a;
//	char b;
//};
//int main()
//{
//	union zmh test;
//	test.a = 0x11223344;
//	if (test.b == 0x44)
//		printf("小端存储");
//	else
//		printf("大端存储");
//	 
//	return 0;
//}
//int main()
//{
//	//定义三个变量
//	int a = 0, b = 0, c = 0;
//	//键盘输入
//	scanf("%d%d%d", &a, &b, &c);
//	//定义一个变量获取最大的数
//	int max = 0;
//	if (a >= b)
//		max = a;
//	else
//		max = b;
//	if (max >= c)
//		;
//	else
//		max = c;
//	//输出
//	printf("%d", max);
//	return 0;
//}
//int main()
//{
//	struct {
//		int a;
//	}a = {4};
//	printf("%d", a.a);
//	return 0;
//}
//int main()
//{
//	int a = 3, b = 4, c = 5, ret = 0;
//	ret = (a + b > c && b == c);
//	//操作符&&的优先级最低,再根据结合性可知
//	//所以先计算a+b>c(条件为真返回1，条件为假返回0)  -> 1
//	//同理 b==c (条件为假返回0) -> 0
//	// && 左右两个操作数，同真则真，一假则假 
//	/printf("%d\n", ret);
//	ret = (a || b + c && b - c);
//	//由操作符的优先性可知，先计算(a),后计算(b+c)两式子
//	//a非0，返回1
//	// || 发生短路，(b+c)表达式不进行运算。
//	// (a || b + c),整个式子返回1;->(1 && b-c);
//	//(b-c)结果非0，返回1;->(1 && 1)
//	//该结果为1；
//	printf("%d\n", ret);
//	ret = (!(a > b) && !c || 1);
//	//先计算表达式!(a>b)
//	//a>b,条件为假，但又因操作符(！)，反逻辑，所以条件为真返回->1
//	//-> (1&&!c||1)，再计算(!c||1)
//	//!c c非0为真，但又因操作符(！)，反逻辑，返回->0
//	//1 为真，返回1
//	// (!c||1) -> (0||1)
//	//逻辑或操作符(||)，一真则真，返回 1 
//	// (!(a > b) && !c || 1) ->(1&&1)
//	//最终返回值为1
//	printf("%d\n", ret);
//	int x = 0, y = 0;
//	ret = (!(x = a) && (y = b) && 0);
//	// 先计算 !(x = a) 这个表达式；然后计算 (y = b) 这个表达式；
//	// !(x = a) 将x赋值为a，x非0，为真，但又因操作符(！)，反逻辑，返回为0；
//	//逻辑与操作符(&&)发生短路，前面为假，后面的相邻表达式不参与运算，!(x = a) && (y = b) 整个式子最终返回0
//	//(0&&0)
//	//最终结果为0
//	printf("%d\n", ret);
//	ret = (!(a + b) + c - 1 && b + c / 2);
//	//① !(a+b) ->返回0 -> 0+c-1 ->0+5-1,非0 -> 最终结果返回1
//	//② b + c / 2，很明显结果非0，-> 返回1
//	//③ (1 && 1) -> 返回1
//	printf("%d\n", ret);
//}/所以结果是 : (1 && 0) ->0;
//	